package com.agrimall.mapper;

import com.agrimall.entity.Order;
import org.apache.ibatis.annotations.Param;
import java.util.List;

/**
 * 订单Mapper接口
 */
public interface OrderMapper {
    /**
     * 根据ID查询订单
     */
    Order selectById(Long orderId);
    
    /**
     * 根据订单编号查询订单
     */
    Order selectByOrderNo(String orderNo);
    
    /**
     * 插入订单
     */
    int insert(Order order);
    
    /**
     * 更新订单
     */
    int update(Order order);
    
    /**
     * 根据用户ID查询订单列表
     */
    List<Order> selectByUserId(@Param("userId") Long userId,
                               @Param("offset") int offset,
                               @Param("limit") int limit);
    
    /**
     * 根据商户ID查询订单列表
     */
    List<Order> selectByMerchantId(@Param("merchantId") Long merchantId,
                                   @Param("offset") int offset,
                                   @Param("limit") int limit);
    
    /**
     * 根据订单状态查询订单列表
     */
    List<Order> selectByStatus(@Param("status") Integer status,
                               @Param("offset") int offset,
                               @Param("limit") int limit);
    
    /**
     * 根据用户ID统计订单总数
     */
    int countByUserId(Long userId);
    
    /**
     * 根据商户ID统计订单总数
     */
    int countByMerchantId(Long merchantId);
    
    /**
     * 统计所有订单总数
     */
    int countAll();
    
    /**
     * 管理员多条件查询订单列表
     */
    List<Order> selectForAdminByConditions(@Param("orderNo") String orderNo,
                                          @Param("status") Integer status,
                                          @Param("merchantId") Long merchantId,
                                          @Param("userId") Long userId,
                                          @Param("offset") int offset,
                                          @Param("limit") int limit);
    
    /**
     * 管理员多条件统计订单数量
     */
    int countForAdminByConditions(@Param("orderNo") String orderNo,
                                  @Param("status") Integer status,
                                  @Param("merchantId") Long merchantId,
                                  @Param("userId") Long userId);
    
    /**
     * 查询所有订单列表（管理员）
     */
    List<Order> selectAllForAdmin(@Param("offset") int offset, @Param("limit") int limit);
    
    /**
     * 商家端多条件查询订单列表
     */
    List<Order> selectByMerchantWithConditions(@Param("merchantId") Long merchantId,
                                               @Param("orderNo") String orderNo,
                                               @Param("receiverName") String receiverName,
                                               @Param("receiverPhone") String receiverPhone,
                                               @Param("offset") int offset,
                                               @Param("limit") int limit);
    
    /**
     * 商家端多条件统计订单数量
     */
    int countByMerchantWithConditions(@Param("merchantId") Long merchantId,
                                     @Param("orderNo") String orderNo,
                                     @Param("receiverName") String receiverName,
                                     @Param("receiverPhone") String receiverPhone);
    
    /**
     * 管理员多条件查询订单列表（支持账号搜索和收货信息搜索）
     */
    List<Order> selectForAdminByConditionsWithAccount(@Param("orderNo") String orderNo,
                                                       @Param("status") Integer status,
                                                       @Param("merchantUsername") String merchantUsername,
                                                       @Param("userUsername") String userUsername,
                                                       @Param("receiverName") String receiverName,
                                                       @Param("receiverPhone") String receiverPhone,
                                                       @Param("offset") int offset,
                                                       @Param("limit") int limit);
    
    /**
     * 管理员多条件统计订单数量（支持账号搜索和收货信息搜索）
     */
    int countForAdminByConditionsWithAccount(@Param("orderNo") String orderNo,
                                             @Param("status") Integer status,
                                             @Param("merchantUsername") String merchantUsername,
                                             @Param("userUsername") String userUsername,
                                             @Param("receiverName") String receiverName,
                                             @Param("receiverPhone") String receiverPhone);
    
    /**
     * 按订单状态统计订单数量和金额
     */
    List<java.util.Map<String, Object>> countByStatus();
    
    /**
     * 统计总销售额
     */
    java.math.BigDecimal getTotalSales();
    
    /**
     * 根据商户ID和状态查询订单列表
     */
    List<Order> selectByMerchantIdAndStatus(@Param("merchantId") Long merchantId,
                                            @Param("status") Integer status,
                                            @Param("offset") int offset,
                                            @Param("limit") int limit);
    
    /**
     * 根据商户ID和状态统计订单数量
     */
    int countByMerchantIdAndStatus(@Param("merchantId") Long merchantId,
                                   @Param("status") Integer status);
}



